/**
* @author TDSoft
*
*
* La clase Interfaz usada para la gestión de usuarios,
* En principio alta/baja/búsqueda.
* Desde esta clase también se pueden consultar las 
* pruebas pendientes que tiene un Estudiante.
* Esta clase se instancia desde la clase Interfaz 
* PantallaMenuPrincipal 
*
* @see PantallaPruebasEstudiante, PantallaMenuPrincipal
*/
package edu.uoc.tds.pec4.swingx;

import edu.uoc.tds.pec4.common.RemotoInterface;
import edu.uoc.tds.pec4.i18n.GestorIdiomas;
import edu.uoc.tds.pec4.model.TipoUsuario;
import edu.uoc.tds.pec4.model.Universidad;
import edu.uoc.tds.pec4.model.Usuario;
import edu.uoc.tds.pec4.model.Prueba;
import edu.uoc.tds.pec4.exception.CampoVacioException;
import edu.uoc.tds.pec4.exception.CampoExisteException;
import edu.uoc.tds.pec4.exception.LongitudCampoExcedidaException;
import edu.uoc.tds.pec4.exception.UniversidadObligatoriaException;
import edu.uoc.tds.pec4.exception.UsuarioNoTipoUsuarioException;
import edu.uoc.tds.pec4.exception.PasswordIncorrectaException;
import edu.uoc.tds.pec4.exception.BajaUsuarioAdministradorPrincipalException;
import edu.uoc.tds.pec4.exception.BajaEstudiantePruebasPendientes;
import java.rmi.RemoteException;
import java.awt.CardLayout; 
import java.text.SimpleDateFormat;
import javax.swing.JOptionPane;
import java.util.List;
import java.util.Iterator;
import java.awt.Component;
import java.awt.Font;
import java.util.Date;
import java.text.ParseException;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.MaskFormatter;

public class PantallaGestionUsuarios extends javax.swing.JDialog {

    //Objeto remoto
    private RemotoInterface remoto;
    //Usuario conectado
    private Usuario usuarioConectado = null;
    //Lista de universidades cargada en el formulario de gestión de usuario
    private List<Universidad> listaUniversidades = null;
    //Usuario que se está gestionando en el formulario de 
    //alta/baja/consulta o que se pasa desde
    //el formulario de búsqueda al de alta/baja/consulta
    private Usuario usuarioGestion = null;
    //Lista de usuarios encontrados al realizar búsqueda
    private List<Usuario> listaUsuarios = null;
    //Lista de pruebas pendientes del estudiante
    private List<Prueba> listaPruebas = null;
    //Longitud de texto permitida para dar de alta los campos
    private static final int MAX_CHARACTERS_15 = 15;
    private static final int MAX_CHARACTERS_50 = 50;
    
    /**
     * Constructor sin parámetros de la clase PantallaGestionUsuarios.
     * Crea una instancia de PantallaGestionUsuarios.
     * {pre: no hay parámetros}
     * {post: devuelve una instancia de la clase PantallaGestionUsuarios}
     */
    public PantallaGestionUsuarios() {
        initComponents();
    }
    
    /**
     * Constructor con parámetros de la clase PantallaGestionUsuarios.
     * Crea una instancia de PantallaGestionUsuarios.
      * {pre: existe la instancia de la clase PantallaMenuPrincipal 
      * y se ejecuta la acción Gestión de Usuarios}
     * {post: devuelve una instancia de la clase PantallaGestionUsuarios}
     * @param parent representa la clase desde donde se instancia
     * @param modal representa el valor de modalidad que se va a establecer para la ventana
     */
    public PantallaGestionUsuarios(PantallaMenuPrincipal parent, boolean modal) {
        super(parent, modal);
        //Obtenemos el objeto remoto de la ventana padre
        this.remoto = parent.getRemoto();
        //Obtenemos el usuario conectado, tambíen de la ventana padre
        this.usuarioConectado = parent.getUsuario();
        initComponents();
        MyInitComponents();
    }

     /**
     * Accesor de lectura del usuario que se está gestionando 
     * {pre: una instancia de Usuario)
     * {post: devuelve el Usuario que se está gestionando}
     */
    public Usuario getUsuarioGestion(){
        return this.usuarioGestion;
    }
    
    /**
     * Accesor de lectura de las pruebas pendientes del usuario que se está gestionando 
     * {pre: una instancia de Usuario)
     * {post: devuelve la lista de pruebas pendientes del usuario que se está gestionando}
     */
    public List<Prueba> getListaPruebas(){
        return this.listaPruebas;
    }
    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jToolBarraHerramientas = new javax.swing.JToolBar();
        btnNew = new javax.swing.JButton();
        jSeparator2 = new javax.swing.JToolBar.Separator();
        btnDelete = new javax.swing.JButton();
        jSeparator3 = new javax.swing.JToolBar.Separator();
        btnSave = new javax.swing.JButton();
        jSeparator4 = new javax.swing.JToolBar.Separator();
        btnFind = new javax.swing.JButton();
        jSeparator6 = new javax.swing.JToolBar.Separator();
        btnExit = new javax.swing.JButton();
        panelMain = new javax.swing.JPanel();
        panelBusquedas = new javax.swing.JPanel();
        jlblsearchIdentificador = new javax.swing.JLabel();
        jtxtsearchIdentificador = new javax.swing.JTextField();
        jcbbsearchTipoUsuario = new javax.swing.JComboBox();
        jlblsearchTipoUsuario = new javax.swing.JLabel();
        jlblsearchDocumento = new javax.swing.JLabel();
        jtxtsearchDocumento = new javax.swing.JTextField();
        jlblsearchNombre = new javax.swing.JLabel();
        jtxtsearchNombre = new javax.swing.JTextField();
        jlblsearchApellido1 = new javax.swing.JLabel();
        jtxtsearchApellido1 = new javax.swing.JTextField();
        jlblsearchFechaAlta = new javax.swing.JLabel();
        jlblsearchFechaBaja = new javax.swing.JLabel();
        jcbActivos = new javax.swing.JCheckBox();
        jScrollPane1 = new javax.swing.JScrollPane();
        jtblsearchUsuarios = new javax.swing.JTable();
        jcbbsearchFechaAlta = new javax.swing.JComboBox();
        jcbbsearchFechaBaja = new javax.swing.JComboBox();
        jbtnBuscar = new javax.swing.JButton();
        jbtnLimpiar = new javax.swing.JButton();
        jlblSearchUniversidad = new javax.swing.JLabel();
        jcbbsearchUniversidad = new javax.swing.JComboBox();
        MaskFormatter mfalta = null;
        try {
            mfalta = new MaskFormatter("##/##/####");
            mfalta.setPlaceholderCharacter('_');
        } catch (ParseException p) {
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("error.formato.fecha"), GestorIdiomas.getMessage("aviso"), JOptionPane.WARNING_MESSAGE);
        }
        jftxtsearchFechaAlta = jftxtsearchFechaAlta = new javax.swing.JFormattedTextField(mfalta);
        ;
        MaskFormatter mfbaja = null;
        try {
            mfbaja = new MaskFormatter("##/##/####");
            mfbaja.setPlaceholderCharacter('_');
        } catch (ParseException p) {
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("error.formato.fecha"), GestorIdiomas.getMessage("aviso"), JOptionPane.WARNING_MESSAGE);
        }
        jftxtsearchFechaBaja = jftxtsearchFechaBaja = new javax.swing.JFormattedTextField(mfbaja);
        ;
        panelGestionUsuario = new javax.swing.JPanel();
        jlblTiposUsuario = new javax.swing.JLabel();
        jlblIdentificador = new javax.swing.JLabel();
        jtxtIdentificador = new javax.swing.JTextField();
        jlblFechaAlta = new javax.swing.JLabel();
        jtxtFechaAlta = new javax.swing.JTextField();
        jlblFechaBaja = new javax.swing.JLabel();
        jtxtFechaBaja = new javax.swing.JTextField();
        jlblDocumento = new javax.swing.JLabel();
        jtxtDocumento = new javax.swing.JTextField();
        jlblNombre = new javax.swing.JLabel();
        jtxtNombre = new javax.swing.JTextField();
        jlblApellidoPrimero = new javax.swing.JLabel();
        jtxtApellidoPrimero = new javax.swing.JTextField();
        jlblApellidoSegundo = new javax.swing.JLabel();
        jtxtApellidoSegundo = new javax.swing.JTextField();
        jlblUniversidad = new javax.swing.JLabel();
        jcbbUniversidad = new javax.swing.JComboBox();
        jlblLogin = new javax.swing.JLabel();
        jtxtLogin = new javax.swing.JTextField();
        jlblPasword = new javax.swing.JLabel();
        jbtnVerPruebas = new javax.swing.JButton();
        jcbbTipoUsuario = new javax.swing.JComboBox();
        jlblVerificar = new javax.swing.JLabel();
        jPasswordVerificar = new javax.swing.JPasswordField();
        jPassword = new javax.swing.JPasswordField();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenuArchivo = new javax.swing.JMenu();
        jmiSalir = new javax.swing.JMenuItem();
        jMenuEdicion = new javax.swing.JMenu();
        jmiAlta = new javax.swing.JMenuItem();
        jmiBaja = new javax.swing.JMenuItem();
        jmiGuardar = new javax.swing.JMenuItem();
        jmiBusqueda = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("i18n/messages"); // NOI18N
        setTitle(bundle.getString("pantallagestionusuarios.title")); // NOI18N

        jToolBarraHerramientas.setRollover(true);

        btnNew.setForeground(new java.awt.Color(102, 153, 255));
        btnNew.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/New document.png"))); // NOI18N
        btnNew.setToolTipText(bundle.getString("pantallaaltausuario.menu.alta")); // NOI18N
        btnNew.setFocusable(false);
        btnNew.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnNew.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnNew.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnNewActionPerformed(evt);
            }
        });
        jToolBarraHerramientas.add(btnNew);
        jToolBarraHerramientas.add(jSeparator2);

        btnDelete.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/Delete.png"))); // NOI18N
        btnDelete.setToolTipText(bundle.getString("pantallaaltausuario.menu.bajausuario")); // NOI18N
        btnDelete.setEnabled(false);
        btnDelete.setFocusable(false);
        btnDelete.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnDelete.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnDelete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnDeleteActionPerformed(evt);
            }
        });
        jToolBarraHerramientas.add(btnDelete);
        jToolBarraHerramientas.add(jSeparator3);

        btnSave.setForeground(new java.awt.Color(102, 153, 255));
        btnSave.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/Download.png"))); // NOI18N
        btnSave.setToolTipText(bundle.getString("pantallaaltausuario.menu.guardar")); // NOI18N
        btnSave.setEnabled(false);
        btnSave.setFocusable(false);
        btnSave.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnSave.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnSave.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSaveActionPerformed(evt);
            }
        });
        jToolBarraHerramientas.add(btnSave);
        jToolBarraHerramientas.add(jSeparator4);

        btnFind.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/Find.png"))); // NOI18N
        btnFind.setToolTipText(bundle.getString("pantallaaltausuario.menu.buscarusuarios")); // NOI18N
        btnFind.setFocusable(false);
        btnFind.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnFind.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnFind.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnFindActionPerformed(evt);
            }
        });
        jToolBarraHerramientas.add(btnFind);
        jToolBarraHerramientas.add(jSeparator6);

        btnExit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/Exit.png"))); // NOI18N
        btnExit.setToolTipText(bundle.getString("pantallaaltausuario.menu.salir")); // NOI18N
        btnExit.setFocusable(false);
        btnExit.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnExit.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExitsalir(evt);
            }
        });
        jToolBarraHerramientas.add(btnExit);

        panelMain.setLayout(new java.awt.CardLayout());

        jlblsearchIdentificador.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblsearchIdentificador.setText(bundle.getString("pantallaaltausuario.identificador")); // NOI18N

        jtxtsearchIdentificador.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N

        jcbbsearchTipoUsuario.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jcbbsearchTipoUsuario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jcbbsearchTipoUsuarioActionPerformed(evt);
            }
        });

        jlblsearchTipoUsuario.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblsearchTipoUsuario.setText(bundle.getString("pantallaaltausuario.tipousuario")); // NOI18N

        jlblsearchDocumento.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblsearchDocumento.setText(bundle.getString("pantallaaltausuario.documento")); // NOI18N

        jtxtsearchDocumento.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N

        jlblsearchNombre.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblsearchNombre.setText(bundle.getString("pantallaaltausuario.nombre")); // NOI18N

        jtxtsearchNombre.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jtxtsearchNombre.setToolTipText("");

        jlblsearchApellido1.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblsearchApellido1.setText(bundle.getString("pantallaaltausuario.apellidoprimero")); // NOI18N

        jtxtsearchApellido1.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N

        jlblsearchFechaAlta.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblsearchFechaAlta.setText(bundle.getString("pantallaaltausuario.fechaalta")); // NOI18N

        jlblsearchFechaBaja.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblsearchFechaBaja.setText(bundle.getString("pantallaaltausuario.fechabaja")); // NOI18N

        jcbActivos.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jcbActivos.setSelected(true);
        jcbActivos.setText(bundle.getString("pantallabusquedausuarios.activos")); // NOI18N
        jcbActivos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jcbActivosActionPerformed(evt);
            }
        });

        jtblsearchUsuarios.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null}
            },
            new String [] {
                "Tipo de usuario"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jtblsearchUsuarios.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jtblsearchUsuariosMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(jtblsearchUsuarios);
        jtblsearchUsuarios.getColumnModel().getColumn(0).setHeaderValue(bundle.getString("pantallabusquedausuarios.tipousuario")); // NOI18N

        jcbbsearchFechaAlta.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jcbbsearchFechaAlta.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "=", ">", "<" }));

        jcbbsearchFechaBaja.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jcbbsearchFechaBaja.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "=", ">", "<" }));

        jbtnBuscar.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jbtnBuscar.setText(bundle.getString("pantallabusquedausuarios.buscar")); // NOI18N
        jbtnBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnBuscarActionPerformed(evt);
            }
        });

        jbtnLimpiar.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jbtnLimpiar.setText(bundle.getString("pantallabusquedausuarios.limpiarformulario")); // NOI18N
        jbtnLimpiar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnLimpiarActionPerformed(evt);
            }
        });

        jlblSearchUniversidad.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblSearchUniversidad.setText(bundle.getString("pantallaaltausuario.universidad")); // NOI18N

        jcbbsearchUniversidad.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N

        jftxtsearchFechaBaja.setEnabled(false);

        javax.swing.GroupLayout panelBusquedasLayout = new javax.swing.GroupLayout(panelBusquedas);
        panelBusquedas.setLayout(panelBusquedasLayout);
        panelBusquedasLayout.setHorizontalGroup(
            panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBusquedasLayout.createSequentialGroup()
                .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelBusquedasLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane1))
                    .addGroup(panelBusquedasLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panelBusquedasLayout.createSequentialGroup()
                                .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(jlblsearchIdentificador)
                                    .addComponent(jlblsearchDocumento)
                                    .addComponent(jlblsearchApellido1)
                                    .addComponent(jlblSearchUniversidad))
                                .addGap(18, 18, 18)
                                .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(panelBusquedasLayout.createSequentialGroup()
                                        .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jtxtsearchIdentificador, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE)
                                            .addComponent(jtxtsearchDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, 134, javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 39, Short.MAX_VALUE)
                                        .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jlblsearchTipoUsuario)
                                            .addComponent(jlblsearchNombre))
                                        .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                            .addGroup(panelBusquedasLayout.createSequentialGroup()
                                                .addGap(31, 31, 31)
                                                .addComponent(jtxtsearchNombre, javax.swing.GroupLayout.PREFERRED_SIZE, 205, javax.swing.GroupLayout.PREFERRED_SIZE))
                                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelBusquedasLayout.createSequentialGroup()
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(jcbbsearchTipoUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 205, javax.swing.GroupLayout.PREFERRED_SIZE))))
                                    .addComponent(jtxtsearchApellido1)
                                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelBusquedasLayout.createSequentialGroup()
                                        .addComponent(jbtnBuscar)
                                        .addGap(18, 18, 18)
                                        .addComponent(jbtnLimpiar))
                                    .addComponent(jcbbsearchUniversidad, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                            .addGroup(panelBusquedasLayout.createSequentialGroup()
                                .addComponent(jlblsearchFechaAlta)
                                .addGap(18, 18, 18)
                                .addComponent(jcbbsearchFechaAlta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jftxtsearchFechaAlta, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jcbActivos)
                                .addGap(48, 48, 48)
                                .addComponent(jlblsearchFechaBaja)
                                .addGap(18, 18, 18)
                                .addComponent(jcbbsearchFechaBaja, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(12, 12, 12)
                                .addComponent(jftxtsearchFechaBaja, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                .addContainerGap())
        );
        panelBusquedasLayout.setVerticalGroup(
            panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBusquedasLayout.createSequentialGroup()
                .addGap(25, 25, 25)
                .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblsearchIdentificador)
                    .addComponent(jtxtsearchIdentificador, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jcbbsearchTipoUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jlblsearchTipoUsuario))
                .addGap(18, 18, 18)
                .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblsearchDocumento)
                    .addComponent(jtxtsearchDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jlblsearchNombre)
                    .addComponent(jtxtsearchNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblsearchApellido1)
                    .addComponent(jtxtsearchApellido1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblSearchUniversidad)
                    .addComponent(jcbbsearchUniversidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblsearchFechaAlta)
                    .addComponent(jcbbsearchFechaAlta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jcbActivos)
                    .addComponent(jlblsearchFechaBaja)
                    .addComponent(jcbbsearchFechaBaja, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jftxtsearchFechaAlta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jftxtsearchFechaBaja, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(panelBusquedasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jbtnLimpiar, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jbtnBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 15, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 172, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        panelMain.add(panelBusquedas, "card3");

        jlblTiposUsuario.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblTiposUsuario.setText(bundle.getString("pantallaaltausuario.tipousuario")); // NOI18N

        jlblIdentificador.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblIdentificador.setText(bundle.getString("pantallaaltausuario.identificador")); // NOI18N

        jtxtIdentificador.setEditable(false);
        jtxtIdentificador.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jtxtIdentificador.setPreferredSize(new java.awt.Dimension(6, 20));

        jlblFechaAlta.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblFechaAlta.setText(bundle.getString("pantallaaltausuario.fechaalta")); // NOI18N

        jtxtFechaAlta.setEditable(false);
        jtxtFechaAlta.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jtxtFechaAlta.setToolTipText("");

        jlblFechaBaja.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblFechaBaja.setText(bundle.getString("pantallaaltausuario.fechabaja")); // NOI18N

        jtxtFechaBaja.setEditable(false);
        jtxtFechaBaja.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jtxtFechaBaja.setForeground(new java.awt.Color(204, 51, 0));

        jlblDocumento.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblDocumento.setText(bundle.getString("pantallaaltausuario.documento")); // NOI18N

        jtxtDocumento.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N

        jlblNombre.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblNombre.setText(bundle.getString("pantallaaltausuario.nombre")); // NOI18N

        jtxtNombre.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N

        jlblApellidoPrimero.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblApellidoPrimero.setText(bundle.getString("pantallaaltausuario.apellidoprimero")); // NOI18N

        jtxtApellidoPrimero.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N

        jlblApellidoSegundo.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblApellidoSegundo.setText(bundle.getString("pantallaaltausuario.apellidosegundo")); // NOI18N

        jtxtApellidoSegundo.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N

        jlblUniversidad.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblUniversidad.setText(bundle.getString("pantallaaltausuario.universidad")); // NOI18N

        jcbbUniversidad.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jcbbUniversidad.setEnabled(false);

        jlblLogin.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblLogin.setText(bundle.getString("pantallaaltausuario.login")); // NOI18N

        jtxtLogin.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N

        jlblPasword.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblPasword.setText(bundle.getString("pantallaaltausuario.pasword")); // NOI18N

        jbtnVerPruebas.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jbtnVerPruebas.setText(bundle.getString("pantallaaltausuario.pruebasusuario")); // NOI18N
        jbtnVerPruebas.setEnabled(false);
        jbtnVerPruebas.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnVerPruebasActionPerformed(evt);
            }
        });

        jcbbTipoUsuario.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jcbbTipoUsuario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jcbbTipoUsuarioActionPerformed(evt);
            }
        });

        jlblVerificar.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jlblVerificar.setText(bundle.getString("pantallaaltausuario.verificar")); // NOI18N

        jPasswordVerificar.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N

        jPassword.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N

        javax.swing.GroupLayout panelGestionUsuarioLayout = new javax.swing.GroupLayout(panelGestionUsuario);
        panelGestionUsuario.setLayout(panelGestionUsuarioLayout);
        panelGestionUsuarioLayout.setHorizontalGroup(
            panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelGestionUsuarioLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelGestionUsuarioLayout.createSequentialGroup()
                        .addComponent(jlblIdentificador)
                        .addGap(18, 18, 18)
                        .addComponent(jtxtIdentificador, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(55, 55, 55)
                        .addComponent(jlblFechaAlta)
                        .addGap(18, 18, 18)
                        .addComponent(jtxtFechaAlta, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 54, Short.MAX_VALUE)
                        .addComponent(jlblFechaBaja)
                        .addGap(18, 18, 18)
                        .addComponent(jtxtFechaBaja, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelGestionUsuarioLayout.createSequentialGroup()
                        .addGroup(panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jlblDocumento)
                            .addComponent(jlblApellidoPrimero)
                            .addComponent(jlblApellidoSegundo)
                            .addComponent(jlblUniversidad)
                            .addComponent(jlblPasword))
                        .addGap(18, 18, 18)
                        .addGroup(panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jtxtApellidoPrimero)
                            .addComponent(jtxtApellidoSegundo)
                            .addComponent(jcbbUniversidad, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addGroup(panelGestionUsuarioLayout.createSequentialGroup()
                                .addComponent(jtxtDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, 136, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(227, 227, 227)
                                .addComponent(jtxtNombre))))
                    .addGroup(panelGestionUsuarioLayout.createSequentialGroup()
                        .addComponent(jlblTiposUsuario)
                        .addGap(31, 31, 31)
                        .addGroup(panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jcbbTipoUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 199, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 135, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(18, 18, 18)
                        .addGroup(panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panelGestionUsuarioLayout.createSequentialGroup()
                                .addComponent(jlblNombre)
                                .addGap(0, 0, Short.MAX_VALUE))
                            .addGroup(panelGestionUsuarioLayout.createSequentialGroup()
                                .addComponent(jlblLogin)
                                .addGap(107, 107, 107)
                                .addComponent(jtxtLogin))
                            .addGroup(panelGestionUsuarioLayout.createSequentialGroup()
                                .addComponent(jlblVerificar)
                                .addGap(18, 18, 18)
                                .addComponent(jPasswordVerificar))))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelGestionUsuarioLayout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(jbtnVerPruebas, javax.swing.GroupLayout.PREFERRED_SIZE, 216, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        panelGestionUsuarioLayout.setVerticalGroup(
            panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelGestionUsuarioLayout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addGroup(panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblIdentificador)
                    .addComponent(jtxtIdentificador, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jlblFechaAlta)
                    .addComponent(jtxtFechaAlta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jlblFechaBaja)
                    .addComponent(jtxtFechaBaja, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblTiposUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jcbbTipoUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jlblLogin)
                    .addComponent(jtxtLogin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblPasword)
                    .addComponent(jlblVerificar)
                    .addComponent(jPasswordVerificar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblDocumento)
                    .addComponent(jtxtDocumento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jlblNombre)
                    .addComponent(jtxtNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblApellidoPrimero)
                    .addComponent(jtxtApellidoPrimero, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblApellidoSegundo)
                    .addComponent(jtxtApellidoSegundo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(panelGestionUsuarioLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jlblUniversidad)
                    .addComponent(jcbbUniversidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(34, 34, 34)
                .addComponent(jbtnVerPruebas, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(109, Short.MAX_VALUE))
        );

        panelMain.add(panelGestionUsuario, "card2");

        jMenuArchivo.setText(bundle.getString("menu.archivo.text")); // NOI18N

        jmiSalir.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
        jmiSalir.setText(bundle.getString("menu.salir.text")); // NOI18N
        jmiSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmiSalirActionPerformed(evt);
            }
        });
        jMenuArchivo.add(jmiSalir);

        jMenuBar1.add(jMenuArchivo);

        jMenuEdicion.setText(bundle.getString("menu.edicion.text")); // NOI18N

        jmiAlta.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));
        jmiAlta.setText(bundle.getString("menu.altausuario.text")); // NOI18N
        jmiAlta.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmiAltaActionPerformed(evt);
            }
        });
        jMenuEdicion.add(jmiAlta);

        jmiBaja.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_B, java.awt.event.InputEvent.CTRL_MASK));
        jmiBaja.setText(bundle.getString("menu.bajausuario.text")); // NOI18N
        jmiBaja.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmiBajaActionPerformed(evt);
            }
        });
        jMenuEdicion.add(jmiBaja);

        jmiGuardar.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_G, java.awt.event.InputEvent.CTRL_MASK));
        jmiGuardar.setText(bundle.getString("menu.guardar.text")); // NOI18N
        jmiGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmiGuardarActionPerformed(evt);
            }
        });
        jMenuEdicion.add(jmiGuardar);

        jmiBusqueda.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.CTRL_MASK));
        jmiBusqueda.setText(bundle.getString("menu.busquedausuarios.text")); // NOI18N
        jmiBusqueda.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmiBusquedaActionPerformed(evt);
            }
        });
        jMenuEdicion.add(jmiBusqueda);

        jMenuBar1.add(jMenuEdicion);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jToolBarraHerramientas, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(panelMain, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBarraHerramientas, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelMain, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-673)/2, (screenSize.height-556)/2, 673, 556);
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Inicialización de componentes al abrir la ventana por primera vez 
     */
    private void MyInitComponents(){
        
        //Inicializar panel alta/baja/consulta:
        inicializarComboUniversidades();
        inicializarComboTiposUsuarioGestion();
        clearPanelGestion();
        setEnabledPanelGestion(true);
        //Inicializar panel búsquedas:
        inicializarComboUniversidadesBusqueda();
        inicializarComboTiposUsuarioBusqueda();
        inicializarTablaResultadosBusqueda();
        inicializarFechasBusqueda();
        clearPanelBusqueda();
        //Al entrar en la ventana se muestra el panel alta/baja/consulta
        showPanelGestion();
    }
    
    
    //*********************************************************************************
    // Métodos relacionados con el panel de gestión de usuario (alta/baja/consulta)
    //*********************************************************************************
    
    /**
     * Se recuperan las Universidades disponibles en el sistema.
     * Se agregan al combo de Universidades en el panel de alta/baja/consulta de usuario.
     */
    private void inicializarComboUniversidades(){
        try{
            this.listaUniversidades = this.remoto.getUniversidades();
            this.jcbbUniversidad.removeAllItems();
            this.jcbbUniversidad.addItem(GestorIdiomas.getMessage("pantallaaltausuario.jcbbUniversidad.item.seleccion"));
            for ( Iterator iterador = this.listaUniversidades.listIterator(); iterador.hasNext(); ) {
                  Universidad universidad = (Universidad) iterador.next();
                  this.jcbbUniversidad.addItem(universidad.getNombre());
            }  
        }catch(RemoteException exc){
            /** Capturamos el error remoto */
            JOptionPane.showMessageDialog(this, exc.detail, GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
        catch(Exception exc){
            /** Capturamos excepción de carácter general */
            JOptionPane.showMessageDialog(this,GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }
    
    /**
     * Limpiamos el panel de Gestión del el alta/baja/consulta de un usuario
     */
    private void clearPanelGestion(){
        //Se limpia el usuario que se estuviese gestionando, si hubiese alguno
        this.usuarioGestion = null;
        //Se limpian el resto de campos
        this.jtxtIdentificador.setText(null);
        this.jtxtFechaAlta.setText(null);
        this.jtxtFechaBaja.setText(null);
        this.jtxtDocumento.setText(null);
        this.jtxtNombre.setText(null);
        this.jtxtApellidoPrimero.setText(null);
        this.jtxtApellidoSegundo.setText(null);
        this.jtxtLogin.setText(null);
        this.jPassword.setText(null);
        this.jPasswordVerificar.setText(null);
        //Se muestra el primer item de los combos Universidad y Tipo de Usuario
        this.jcbbUniversidad.setSelectedIndex(0);
        this.jcbbTipoUsuario.setSelectedIndex(0);
        //Se habilita el menú de guardar, pero se deshabilita 
        //el de dar de baja porque no hay usuario a gestionar
        setEnabledMenuGuardar(true);
        setEnabledMenuBaja(false);
    }
    
    /**
     * Función para habilitar/Deshabilitar los controles del panel 
     * alta/baja/consulta en función de la acción que vaya a realizar
     * el usuario Administrador.
     */
    private void setEnabledPanelGestion(boolean enabled){
        
        //Obtenemos todos los componentes del panel
        Component[] com = this.panelGestionUsuario.getComponents();  
        //Los recorremos y los vamos habilitando/deshabilitando según el caso
        for (int a = 0; a < com.length; a++) {  
            //com[a].setEnabled(enabled);  
            if (com[a] instanceof JTextField){
                ((JTextField)com[a]).setEditable(enabled);
            }else if (com[a] instanceof JLabel){
                com[a].setEnabled(true);
            }else{
                com[a].setEnabled(enabled);
            }
        }  
        
        //Independientemente de que se habilite o no el formulario de alta/baja/consulta
        //estos tres controles siempre tienen que estar no editables
        this.jtxtIdentificador.setEditable(false);
        this.jtxtFechaAlta.setEditable(false);
        this.jtxtFechaBaja.setEditable(false);
        //Dependiendo de la acción, a posteriori, se deshabilitarán el combo
        //correspondiente si es oportuno.
        setEnabledComboUniversidad(false);
        setEnabledConsultarPruebas(false);
    }
    
    /**
     * Función para chequear que los campos obligatorios en el alta, 
     * tienen algún valor. En caso contrario se lanza la excepción correspondiente
     * CampoVacioException.
     */
    private void chequearCamposVacios() throws CampoVacioException{
        
        if (this.jcbbTipoUsuario.getSelectedItem().equals(GestorIdiomas.getMessage("pantallaaltausuario.jcbbTipoUsuario.item.seleccion"))){
            throw new CampoVacioException(String.format(GestorIdiomas.getMessage("error.campo.vacio"),GestorIdiomas.getMessage("pantallaaltausuario.campo.tipousuario")));
        }
        if (this.jtxtLogin.getText().isEmpty()){
            throw new CampoVacioException(String.format(GestorIdiomas.getMessage("error.campo.vacio"),GestorIdiomas.getMessage("pantallaaltausuario.campo.loginusuario")));
        }
        if (String.valueOf(this.jPassword.getPassword()).trim().length() == 0){
            throw new CampoVacioException(String.format(GestorIdiomas.getMessage("error.campo.vacio"),GestorIdiomas.getMessage("pantallaaltausuario.campo.contrasenia")));
        }
        if (String.valueOf(this.jPasswordVerificar.getPassword()).trim().length() == 0){
            throw new CampoVacioException(String.format(GestorIdiomas.getMessage("error.campo.vacio"),GestorIdiomas.getMessage("pantallaaltausuario.campo.verificarcontrasenia")));
        }
        if (this.jtxtDocumento.getText().isEmpty()){
            throw new CampoVacioException(String.format(GestorIdiomas.getMessage("error.campo.vacio"),GestorIdiomas.getMessage("pantallaaltausuario.campo.documento")));
        }
        if (this.jtxtNombre.getText().isEmpty()){
            throw new CampoVacioException(String.format(GestorIdiomas.getMessage("error.campo.vacio"),GestorIdiomas.getMessage("pantallaaltausuario.campo.nombre")));
        }
        if (this.jtxtApellidoPrimero.getText().isEmpty()){
            throw new CampoVacioException(String.format(GestorIdiomas.getMessage("error.campo.vacio"),GestorIdiomas.getMessage("pantallaaltausuario.campo.apellidoprimero")));
        }
        //El apellido segundo no es obligatorio introducirlo y no se controla en la función
    }
    
    /**
     * Función para chequear que los campos no superan la longitud permitida 
     * durante el alta. En caso contrario se lanza la excepción correspondiente
     * LongitudCampoExcedidaException.
     */
    private void chequearLongitudCampos() throws LongitudCampoExcedidaException{
        
        if (this.jtxtDocumento.getText().trim().length()>MAX_CHARACTERS_50){
            throw new LongitudCampoExcedidaException(String.format(GestorIdiomas.getMessage("error.longitud.campo.excedida"),GestorIdiomas.getMessage("pantallaaltausuario.campo.documento"),MAX_CHARACTERS_50));
        }
        if (this.jtxtLogin.getText().trim().length()>MAX_CHARACTERS_15){
            throw new LongitudCampoExcedidaException(String.format(GestorIdiomas.getMessage("error.longitud.campo.excedida"),GestorIdiomas.getMessage("pantallaaltausuario.campo.loginusuario"),MAX_CHARACTERS_15));
        }
        if (String.valueOf(this.jPassword.getPassword()).trim().length()>MAX_CHARACTERS_15){
            throw new LongitudCampoExcedidaException(String.format(GestorIdiomas.getMessage("error.longitud.campo.excedida"),GestorIdiomas.getMessage("pantallaaltausuario.campo.contraseña"),MAX_CHARACTERS_15));
        } 
        if (String.valueOf(this.jPasswordVerificar.getPassword()).trim().length()>MAX_CHARACTERS_15){
            throw new LongitudCampoExcedidaException(String.format(GestorIdiomas.getMessage("error.longitud.campo.excedida"),GestorIdiomas.getMessage("pantallaaltausuario.campo.verificarcontraseña"),MAX_CHARACTERS_15));
        }
        if (this.jtxtNombre.getText().trim().length()>MAX_CHARACTERS_50){
            throw new LongitudCampoExcedidaException(String.format(GestorIdiomas.getMessage("error.longitud.campo.excedida"),GestorIdiomas.getMessage("pantallaaltausuario.campo.nombre"),MAX_CHARACTERS_50));
        }
        if (this.jtxtApellidoPrimero.getText().trim().length()>MAX_CHARACTERS_50){
            throw new LongitudCampoExcedidaException(String.format(GestorIdiomas.getMessage("error.longitud.campo.excedida"),GestorIdiomas.getMessage("pantallaaltausuario.campo.apellidoprimero"),MAX_CHARACTERS_50));
        }
        if (this.jtxtApellidoSegundo.getText().trim().length()>MAX_CHARACTERS_50){
            throw new LongitudCampoExcedidaException(String.format(GestorIdiomas.getMessage("error.longitud.campo.excedida"),GestorIdiomas.getMessage("pantallaaltausuario.campo.apellidosegundo"),MAX_CHARACTERS_50));
        }
    }
    
    /**
     * Función para chequear que el valor introducido en el campo contraseña
     * coincide con el valor del campo verificar contraseña.
     * En caso contrario se lanza la excepción correspondiente
     * PasswordIncorrectaException.
     */
    private void chequearPassword() throws PasswordIncorrectaException{
        if (!String.valueOf(this.jPassword.getPassword()).trim().equals(String.valueOf(this.jPasswordVerificar.getPassword()).trim())){
            throw new PasswordIncorrectaException(GestorIdiomas.getMessage("error.password.no.coincide"));
        } 
    }
    
    /**
     * Función para chequear que si el Administrador está realizando el alta de un
     * usuario, es obligatorio seleccionar la Universidad a la que pertenece el mismo.
     * En caso contrario se lanza la excepción correspondiente UniversidadObligatoriaException.
     */
    private void chequearUniversidad() throws UniversidadObligatoriaException{
        if(this.jcbbTipoUsuario.getSelectedItem().equals(TipoUsuario.ESTUDIANTE.toString())){
            if (this.jcbbUniversidad.getSelectedItem().toString().trim().equals(GestorIdiomas.getMessage("pantallaaltausuario.jcbbUniversidad.item.seleccion"))){
                throw new UniversidadObligatoriaException(GestorIdiomas.getMessage("error.universidad.obligatoria"));
            }
        }
    }
    
    /**
     * Función para chequear si el login del usuario que se desea dar de alta
     * ya existe asignado a algún otro usuario en el sistema.
     * Si existe, se lanza la excepción correspondiente CampoExisteException.
     */
    private void chequearLogin() throws CampoExisteException, RemoteException{
        if (this.remoto.existeLogin(this.jtxtLogin.getText().trim())){
            throw new CampoExisteException(String.format(GestorIdiomas.getMessage("error.campo.existe"),GestorIdiomas.getMessage("pantallaaltausuario.campo.loginusuario")));
        } 
    }
    
    /**
     * Función para chequear si el documento del usuario que se desea dar de alta
     * ya existe asignado a algún otro usuario en el sistema.
     * Si existe, se lanza la excepción correspondiente CampoExisteException.
     */
    private void chequearDocumento() throws CampoExisteException, RemoteException{
        if (this.remoto.existeDocumento(this.jtxtDocumento.getText().trim())){
            throw new CampoExisteException(String.format(GestorIdiomas.getMessage("error.campo.existe"),GestorIdiomas.getMessage("pantallaaltausuario.campo.documento")));
        } 
    }
    
    /**
     * Función para obtener el Id de universidad que se dará de alta para el estudiante,
     * a partir del nombre de la universidad.
     * Se busca en el listado de universidades cargado al iniciar la instancia de la clase.
     */
    private int getIdUniversidad(){
        int id_universidad = 0;
        //Obtenemos el identificador de la universidad seleccionada para dar de alta a un estudiante
        for ( Iterator iterador = this.listaUniversidades.listIterator(); iterador.hasNext(); ) {
            Universidad universidad = (Universidad) iterador.next();
            if (universidad.getNombre() == this.jcbbUniversidad.getSelectedItem().toString()){
                id_universidad = universidad.getId_universidad();
                break;
            }
        }      
        return id_universidad;
    }
    
    /**
     * Función que realiza el proceso de alta de un usuario.
     */
    private void altaUsuario(){
        
        int id_tipo_usuario = 0;
        int id_universidad = 0;
        Date fecha_alta = new Date();
        
        try{
            //Hacemos las validaciones de los datos introducidos por el administrador
            chequearCamposVacios();
            chequearLongitudCampos();
            chequearLogin();
            chequearPassword();
            chequearDocumento();
            chequearUniversidad();
            id_tipo_usuario = this.getIdTipoUsuario(this.jcbbTipoUsuario.getSelectedItem().toString());
            
            //Si el tipo de usuario corresponde a un estudiante, obtenemos 
            //el id de universidad del estudiante correspondiente al nombre 
            //seleccionado en el combo de universidades
            if (id_tipo_usuario == TipoUsuario.ESTUDIANTE.getIdTipoUsuario()){
                id_universidad = getIdUniversidad();
            }
            //Proceso de alta
            this.usuarioGestion = this.remoto.altaUsuario(id_tipo_usuario,
                                                            this.jtxtLogin.getText().trim(),
                                                            String.valueOf(this.jPassword.getPassword()).trim(),
                                                            this.jtxtDocumento.getText().trim(),
                                                            this.jtxtNombre.getText().trim(),
                                                            this.jtxtApellidoPrimero.getText().trim(),
                                                            this.jtxtApellidoSegundo.getText().trim(),
                                                            id_universidad,
                                                            fecha_alta);
            //Actualizamos los datos correspondientes al alta en el formulario
            this.jtxtIdentificador.setText(Integer.toString(this.usuarioGestion.getId_usuario()));
            this.jtxtFechaAlta.setText(dateToString(this.usuarioGestion.getFecha_alta()));
            //Habilitamos/deshabilitamos los controles necesarios tras el alta
            setEnabledPanelGestion(false);
            setEnabledMenuGuardar(false);
            setEnabledMenuBaja(true);
            if(this.jcbbTipoUsuario.getSelectedItem().equals(TipoUsuario.ESTUDIANTE.toString())){
                setEnabledConsultarPruebas(true);
            }else{
                setEnabledConsultarPruebas(false);
            }
        }catch(CampoVacioException exc){
            /** Capturamos excepción de campo obligatorio no cumplimentado*/
            JOptionPane.showMessageDialog(this, exc.getMessage(), GestorIdiomas.getMessage("aviso"), JOptionPane.WARNING_MESSAGE);
        }catch(LongitudCampoExcedidaException exc){
            /** Capturamos excepción de longitud de campo excedida*/
            JOptionPane.showMessageDialog(this, exc.getMessage(), GestorIdiomas.getMessage("aviso"), JOptionPane.WARNING_MESSAGE);
        }catch(CampoExisteException exc){
            /** Capturamos excepción de existe valor de campo en el sistema*/
            JOptionPane.showMessageDialog(this, exc.getMessage(), GestorIdiomas.getMessage("aviso"), JOptionPane.WARNING_MESSAGE);
        }catch(UniversidadObligatoriaException exc){
            /** Capturamos excepción de Universidad obligatoria para el alta de un estudiante*/
            JOptionPane.showMessageDialog(this, exc.getMessage(), GestorIdiomas.getMessage("aviso"), JOptionPane.WARNING_MESSAGE);
        }catch(PasswordIncorrectaException exc){
            /** Capturamos excepción de no coincide valor campo contraseña y verificar contraseña*/
            JOptionPane.showMessageDialog(this, exc.getMessage(), GestorIdiomas.getMessage("aviso"), JOptionPane.WARNING_MESSAGE);
        }catch (RemoteException exc) {
            /** Capturamos el error remoto */
            JOptionPane.showMessageDialog(this, exc.detail, GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }catch (Exception exc) {
            /** Capturamos excepción de carácter general*/
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }
    
    /**
     * Función que realiza el proceso de baja de un usuario.
     */
    private void bajaUsuario(){
        
        Date fecha_baja = new Date();
        
        try{
            if (this.usuarioGestion != null){
                //Si hay un usuario gestionándose
                if (this.usuarioGestion.getId_usuario()!= 1){
                    //Si el usuario no es el usuario Administrador principal
                    if (this.listaPruebas != null && this.listaPruebas.size()>0){
                        //Si el usuario tiene pruebas pendientes de realizar o finalizar
                        //Lanzamos excepcion de BajaEstudiantePruebasPendientes
                        throw new BajaEstudiantePruebasPendientes(GestorIdiomas.getMessage("error.estudiante.pruebaspendientes.no.baja"));
                    }
                    else{
                        //Si se cumplen las condiciones de baja, se realiza 
                        //el proceso de baja lógica
                        this.remoto.bajaUsuario(this.usuarioGestion.getId_usuario(),
                                                fecha_baja);
                        //Se actualizan los datos en el formulario
                        this.jtxtFechaBaja.setText(dateToString(fecha_baja));
                        //Se deshabilitan los controles necesarios en el formulario
                        setEnabledMenuGuardar(false);
                        setEnabledMenuBaja(false);
                    }
                }else{
                    //Si el usuario es el usuario Administrador principal no puede darse de baja
                    //y lanzamos la excepción correspondiente BajaUsuarioAdministradorPrincipalException
                    throw new BajaUsuarioAdministradorPrincipalException(GestorIdiomas.getMessage("error.usuarioadministradorprincipal.no.baja"));
                }
            }
        }catch (BajaEstudiantePruebasPendientes exc) {
            /** Capturamos error en caso de que se intente dar de baja un estudiante con pruebas pendientes de realizar o finalizar */
            JOptionPane.showMessageDialog(this, exc.getMessage(), GestorIdiomas.getMessage("aviso"), JOptionPane.WARNING_MESSAGE);
        }catch (BajaUsuarioAdministradorPrincipalException exc) {
            /** Capturamos error en caso de que se intente dar de baja al usuario Administrador principal */
            JOptionPane.showMessageDialog(this, exc.getMessage(), GestorIdiomas.getMessage("aviso"), JOptionPane.WARNING_MESSAGE);
        }catch (RemoteException exc) {
            /** Capturamos el error remoto */
            JOptionPane.showMessageDialog(this, exc.detail, GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }catch (Exception exc) {
            /** Capturamos excepción de carácter general*/
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }
    
    /**
     * Función para abrir la pantalla con las pruebas pendientes de realizar o finalizar 
     * del estudiante que se está gestionando.
     */
    private void abrirPantallaPruebasEstudiante(){
        try{
            if (this.listaPruebas != null && this.listaPruebas.size() > 0){
                PantallaPruebasEstudiante pantallaPruebasEstudiante = new PantallaPruebasEstudiante(this, true);
                pantallaPruebasEstudiante.setVisible(true);
            }
            else{
                //Si el estudiante no tiene pruebas pendientes se muestra un mensaje informativo
                JOptionPane.showMessageDialog(this,GestorIdiomas.getMessage("info.estudiante.sin.pruebas.pendientes"), GestorIdiomas.getMessage("info"), JOptionPane.INFORMATION_MESSAGE);
            }
        }catch(Exception exc){
            /** Capturamos excepción de carácter general*/
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }
    
    //***********************************************
    // Métodos relacionados con el panel de búsqueda
    //***********************************************
    
    /**
     * Se agregan al combo de Universidades en el panel de búsquedas de usuario
     * las Universidades recuperadas del sistema a partir de la lista cargada inicialmente.
     */
    private void inicializarComboUniversidadesBusqueda(){
        try{
            this.jcbbsearchUniversidad.removeAllItems();
            this.jcbbsearchUniversidad.addItem(GestorIdiomas.getMessage("pantallaaltausuario.jcbbsearchUniversidad.item.seleccion"));
            //La lista de universidades ya está cargada al inicializar el combo de la parte de gestión
            for ( Iterator iterador = this.listaUniversidades.listIterator(); iterador.hasNext(); ) {
                  Universidad universidad = (Universidad) iterador.next();
                  this.jcbbsearchUniversidad.addItem(universidad.getNombre());
            }
        }catch (Exception exc) {
            /** Capturamos excepción de carácter general*/
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }
    
    /**
     * Se inicializa la tabla de resultados de las búsquedas:
     * Se asignan los nombres de columnas
     * Se borran filas si las hubiese
     */
    private void inicializarTablaResultadosBusqueda(){
        DefaultTableModel aModel = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int row, int column) {
            return false;
            }
        };
        aModel.setColumnIdentifiers(getTableColumnNames());
        this.jtblsearchUsuarios.setModel(aModel);
        aModel.setRowCount(0); // Se borran todas las filas del modelo
        jtblsearchUsuarios.repaint(); //Refleja los cambios en la pantalla
    }
    
    /**
     * Función para habilitar/deshabilitar el control Fecha de baja en las
     * búsquedas en función de si se desean buscar usuarios en activo o de baja
     */
    private void setEnabledSearchFechaBaja(boolean enabled){
        this.jftxtsearchFechaBaja.setEnabled(enabled);
    }
    
    /**
     * Limpiamos el panel de Búsquedas
     */
    private void clearPanelBusqueda(){
        //Se limpia la lista de usuario encontrados en búsquedas anteriores
        this.listaUsuarios = null;
        //Se limpian los campos de búsqueda
        this.jtxtsearchIdentificador.setText(null);
        this.jcbbsearchTipoUsuario.setSelectedIndex(0);
        this.jtxtsearchDocumento.setText(null);
        this.jtxtsearchNombre.setText(null);
        this.jtxtsearchApellido1.setText(null);
        this.jftxtsearchFechaAlta.setText(null);
        this.jftxtsearchFechaBaja.setText(null);
        //Por defecto, se buscan usuarios en activo
        this.jcbActivos.setSelected(true);
        this.jcbbsearchFechaAlta.setSelectedIndex(0);
        this.jcbbsearchFechaBaja.setSelectedIndex(0);
        //Por defecto, al buscar por usuarios en activo, no se habilita la fecha de baja
        setEnabledSearchFechaBaja(false);
        //Se borran las filas de la tabla de resultados si las hubiese
        DefaultTableModel aModel = (DefaultTableModel)jtblsearchUsuarios.getModel();
        aModel.setRowCount(0); // Se borran todas las filas del modelo
        jtblsearchUsuarios.repaint(); //Refleja los cambios en la pantalla
    }
    
    /**
     * Recuperamos el id que corresponde al tipo de usuario
     */
    private int getIdTipoUsuario(String tipo_usuario){
        int id_tipo_usuario = 0;
        if (tipo_usuario.equals(TipoUsuario.ADMINISTRADOR.toString())){
            id_tipo_usuario = TipoUsuario.ADMINISTRADOR.getIdTipoUsuario();
        }else if (tipo_usuario.equals(TipoUsuario.RESPONSABLE_PRUEBA.toString())){
            id_tipo_usuario = TipoUsuario.RESPONSABLE_PRUEBA.getIdTipoUsuario();
        }if (tipo_usuario.equals(TipoUsuario.ESTUDIANTE.toString())){
            id_tipo_usuario = TipoUsuario.ESTUDIANTE.getIdTipoUsuario();
        }
        return id_tipo_usuario;
    }
    
    /**
     * Recuperamos la descripción que corresponde al id tipo de usuario
     */
    public String getTipoUsuario(int id_tipo_usuario){
        String tipo_usuario = "";

        if (id_tipo_usuario == TipoUsuario.ADMINISTRADOR.getIdTipoUsuario()){
            tipo_usuario = TipoUsuario.ADMINISTRADOR.toString();
        }else if (id_tipo_usuario == TipoUsuario.RESPONSABLE_PRUEBA.getIdTipoUsuario()){
            tipo_usuario = TipoUsuario.RESPONSABLE_PRUEBA.toString();
        }else if (id_tipo_usuario == TipoUsuario.ESTUDIANTE.getIdTipoUsuario()){
            tipo_usuario = TipoUsuario.ESTUDIANTE.toString();
        }
        return tipo_usuario;
    }
    
    /**
     * Función para obtener el valor numérico del identificador de usuario introducido para las búsquedas.
     */
    private int getIdUsuario(){
        int id_usuario = 0;
        if (this.jtxtsearchIdentificador.getText().trim().length() > 0){
            //Comprobamos si la cadena contiene un valor numérico
            if (isNumerico(this.jtxtsearchIdentificador.getText().trim())){
                //Realizamos la conversió de string a int
                id_usuario = Integer.parseInt(this.jtxtsearchIdentificador.getText().trim());
            }
        }
        return id_usuario;
    }
    
    /**
     * Función para comprobar si la cadena contiene un valor numérico 
     */
    private boolean isNumerico(String cadena){
        try {
            Integer.parseInt(cadena);
            return true;
        } catch (NumberFormatException exc){
            /** Capturamos excepción de conversión*/
            return false;
        }
    }
    
    /**
     * Función para inicializar las fechas de alta y baja del panel de búsquedas.
     * Se establece la fuente y se asigna el formato dd/MM/yyyy y un inputVerifier
     * para chequear si se ha introducido una fecha correcta.
     */
    private void inicializarFechasBusqueda(){
            
        this.jftxtsearchFechaAlta.setFont(new Font("Tahoma", Font.PLAIN, 12));
            this.jftxtsearchFechaBaja.setFont(new Font("Tahoma", Font.PLAIN, 12));
            this.jftxtsearchFechaAlta.setInputVerifier(new InputVerifier() {
                public boolean verify(JComponent input) {
                    JFormattedTextField tf = (JFormattedTextField) input;
                    String cadena = tf.getText();
                    return checkFecha(cadena);
            }
            });
            this.jftxtsearchFechaBaja.setInputVerifier(new InputVerifier() {
                public boolean verify(JComponent input) {
                    JFormattedTextField tf = (JFormattedTextField) input;
                    String cadena = tf.getText();
                    return checkFecha(cadena);
                }
            });
    }
    
    /**
     * Función que realiza el proceso de chequear si se ha introducido una fecha correcta.
     * Devuelve true si es correcta o no se ha introducido fecha. 
     * False en caso de introducir una fecha incorrecta.
     */
    private boolean checkFecha(String fecha_introducida){
        
        boolean fechaValida = false;
        String[] aFecha;
        int dia = 0;
        int mes = 0;
        int anio = 0;
        
        if (fecha_introducida.trim().length() > 0){
            //Si la fecha introducida tiene valor 
            aFecha = fecha_introducida.trim().split("/");
            if ((!aFecha[0].contains("_")) &&
                    (!aFecha[1].contains("_")) && (!aFecha[2].contains("_"))){
                //Si no contiene ningún caracter de la máscara usada
                //separamos por día,mes y año
                dia = Integer.parseInt(aFecha[0]);
                mes = Integer.parseInt(aFecha[1]);
                anio = Integer.parseInt(aFecha[2]);
                //Comprobamos si la fecha es una fecha válida
                if (isFechaValida(anio,mes,dia)){
                    fechaValida=true;
                } 
            }
            else if (fecha_introducida.trim().equals("__/__/____")){
                //Si la fecha contiene la máscara, la damos por fecha válida,
                //no se ha introducido fecha, y por tanto, no se trata de una fecha incorrecta
                fechaValida=true;
            }
        }
        if (!fechaValida){
            //Si se ha introducido una fecha no válida, se muestra aviso de fecha incorrecta.
            JOptionPane.showMessageDialog(this, String.format(GestorIdiomas.getMessage("error.fecha.no.valida"),fecha_introducida.trim()), GestorIdiomas.getMessage("aviso"), JOptionPane.WARNING_MESSAGE);
        }
        return fechaValida;
    }
    
    /**
     * Función que realiza el proceso de obtener la fecha a partir del dato introducido en el campo correspondiente.
     * Devuelve la fecha, si es valor introducido corresponde a una fecha correcta. 
     * Null en caso de introducir una fecha incorrecta.
     */
    private Date getFecha(String fecha_introducida) throws ParseException{
        Date fecha = null;
        //Verificamos si se trata de una fecha correcta
        if (checkFecha(fecha_introducida)){
            //Si es correcta, bien porque haya introducido una fecha correcta,
            //o bien porque no haya introducido ningún valor y entonces
            //el campo contendrá la máscara
            if (!fecha_introducida.trim().equals("__/__/____")){
                //Si el campo no contiene la máscara entonces es que el
                //usuario ha introducido una fecha, y además ésta es correcta
                //entonces si podemos hacer la conversión de String a Date para devolver la fecha
                fecha = stringToDate(fecha_introducida.trim());
            }
        }
        return fecha;
    }
    
     /**
     * Comprueba si la fecha formado por los argumentos es válida.
     * @param a año 
     * @param m mes
     * @param d día
     * @return cierto si la fecha es válida, esto es,
     * anio &gt; 0, 1&lt;=mes&lt;=12 y 
     * 1&lt;=dia&lt;=30, si mes=4,6,9,11
     * 1&lt;=dia&lt;=31, si mes=1,3,5,7,8,10,12
     * 1&lt;=dia&lt;=28, si mes=2 y a no es bisiesto
     * 1&lt;=dia&lt;=29, si mes=2 y a es bisiesto
     */
    private boolean isFechaValida(int anio, int mes, int dia){
        boolean valida = anio > 0 && 1 <= mes && mes <= 12;
        if (valida) {
            switch (mes) {
            case 4: case 6: case 9: case 11: 
                valida = 1 <= dia && dia <= 30; 
                break;
            case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                valida = 1 <= dia && dia <= 31;
                break;
            case 2: 
                if (!isBisiesto(anio)) {
                    valida = 1 <= dia && dia <= 28;
                } else {
                    valida = 1 <= dia && dia <= 29;
                }
                break;
            }         
        }
        return valida;
    }
    
    /**
     * Retorna si un año es bisiesto.
     * @param anio año
     * @return cierto si a es bisiesto, esto es, se cumple
     * (anio % 4 == 0 && !(anio % 100 == 0 && anio % 400 == 0))
     */
    private boolean isBisiesto(int anio) 
    {
        return (anio % 4 == 0 && !(anio % 100 == 0 && anio % 400 == 0));
    }              
    
    /**
     * Cargamos la tabla de resultados a partir de los valores de la lista obtenida 
     * con los resultados de la búsqueda.
     */
    private void setTablaResultadosBusqueda(){
        try{
        DefaultTableModel aModel = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int row, int column) {
            return false;
            }
        };
        aModel.setColumnIdentifiers(getTableColumnNames());

        Object[] objects = new Object[8];
        //Recorremos los valores de la lista y vamos asignándolos a cada celda de la fila
        for ( Iterator iterador = listaUsuarios.listIterator(); iterador.hasNext(); ) {
            Usuario usuario = (Usuario) iterador.next();
            objects[0]=Integer.toString(usuario.getId_usuario());
            objects[1] = getTipoUsuario(usuario.getId_tipo_usuario());
            objects[2]=usuario.getDocumento();
            objects[3]=usuario.getNombre();
            objects[4]=usuario.getApellido_primero();
            objects[5]= dateToString(usuario.getFecha_alta());
            if (usuario.getFecha_baja()!=null){
                objects[6]=dateToString(usuario.getFecha_baja());
            }
            if (this.remoto.isEstudiante(usuario)){
                //Si el usuario encontrado es de tipo estudiante, volcamos en 
                //la celda el nombre de la Universidad a la que pertenece
                objects[7]=this.remoto.getEstudiante(usuario).getUniversidad().getNombre();    
            }
            aModel.addRow(objects);
        } 
        this.jtblsearchUsuarios.setModel(aModel);
        }catch (RemoteException exc) {
            /** Capturamos excepción remota*/
            JOptionPane.showMessageDialog(this, exc.detail, GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }catch (Exception exc) {
            /** Capturamos excepción de carácter general*/
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }
    
    /**
     * Función que realiza el proceso de búsqueda de usuarios a partir de los filtros
     * introducidos por el Administrador.
     */
    private void buscarUsuarios(){
        
        int id_tipo_usuario = 0;
        int id_usuario = 0;
        Date fecha_alta = null;
        Date fecha_baja = null;
        int id_universidad = 0;
        
        try{
            //Inicializamos la tabla por si hubiese otra búsqueda anterior realizada
            inicializarTablaResultadosBusqueda();
            //Recuperamos los datos usados como filtro
            id_tipo_usuario = getIdTipoUsuario(this.jcbbsearchTipoUsuario.getSelectedItem().toString());
            id_usuario = getIdUsuario();
            fecha_alta = getFecha(this.jftxtsearchFechaAlta.getText());
            fecha_baja = getFecha(this.jftxtsearchFechaBaja.getText());
            if (!this.jcbbsearchUniversidad.getSelectedItem().toString().equals(GestorIdiomas.getMessage("pantallaaltausuario.jcbbsearchUniversidad.item.seleccion"))){
                //Si el Administrador ha seleccionado una Universidad
                //obtenemos el identificador correspondiente al nombre de dicha Universidad
                id_universidad = this.remoto.getIdUniversidad(this.jcbbsearchUniversidad.getSelectedItem().toString());
            }
            //Llamada al método remoto para obtener la lista con los resultados
            listaUsuarios = this.remoto.getListaUsuarios(id_tipo_usuario,
                                                        id_usuario, 
                                                        this.jtxtsearchDocumento.getText(),
                                                        this.jtxtsearchNombre.getText(),
                                                        this.jtxtsearchApellido1.getText(),
                                                        fecha_alta,
                                                        this.jcbbsearchFechaAlta.getSelectedItem().toString(),
                                                        this.jcbActivos.isSelected(),
                                                        fecha_baja,
                                                        this.jcbbsearchFechaBaja.getSelectedItem().toString(),
                                                        id_universidad);
            if (listaUsuarios != null && listaUsuarios.size() > 0){
                //Si se ha encontrado algún usuario, se muestra la información
                //del mismo en la tabla de resultados
                setTablaResultadosBusqueda();
            }
        }catch(ParseException exc){
            /** Capturamos excepción de parseo*/
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("error.formato.fecha"), GestorIdiomas.getMessage("aviso"), JOptionPane.WARNING_MESSAGE);
        }catch (RemoteException exc) {
            /** Capturamos excepción remota*/
            JOptionPane.showMessageDialog(this, exc.detail, GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }catch(Exception exc){
            /** Capturamos excepción de carácter general*/
            JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
        }
    }
    
    /**
     * Función que vuelca la información del usuario encontrado en la búsqueda realizada
     * al panel de gestión en modo consulta, con posibilidad de darlo de baja, sino estuviese ya en ese estado.
     */
    private void setUsuarioToPanelGestion(Usuario usuario) throws RemoteException, UsuarioNoTipoUsuarioException{
        
        String tipo_usuario = "";
        //Inicialmente su lista de pruebas está a null
        this.listaPruebas = null;
        //Deshabilitamos panel de gestión, salvo algunos controles en función del caso.
        setEnabledPanelGestion(false);
        //Volcamos la información del usuario en los controles correspondientes
        this.jtxtIdentificador.setText(Integer.toString(usuario.getId_usuario()));
        tipo_usuario = getTipoUsuario(usuario.getId_tipo_usuario());
        this.jcbbTipoUsuario.setSelectedItem(tipo_usuario);
        this.jcbbUniversidad.setSelectedIndex(0);
        if (this.remoto.isEstudiante(usuario)){
            //Si se trata de un estudiante, habilitamos el botón de consulta de pruebas
            //pendientes de realizar o finalizar por el estudiante
            setEnabledConsultarPruebas(true);
            //Recuperamos las pruebas pendientes de realizar o finalizar por el estudiante si las tiene
            this.listaPruebas = this.remoto.getListaPruebasEstudiante(this.usuarioGestion.getId_usuario());
            //Al ser estudiante, también seleccionamos en el combo, el nombre de la Universidad que 
            //que corresponde al id universidad del usuario estudiante.
            this.jcbbUniversidad.setSelectedItem(this.remoto.getEstudiante(usuario).getUniversidad().getNombre());
        }
        this.jtxtDocumento.setText(usuario.getDocumento());
        this.jtxtNombre.setText(usuario.getNombre());
        this.jtxtApellidoPrimero.setText(usuario.getApellido_primero());
        this.jtxtApellidoSegundo.setText(usuario.getApellido_segundo());
        this.jtxtLogin.setText(usuario.getUsuario());
        this.jPassword.setText(usuario.getClave());
        this.jPasswordVerificar.setText(usuario.getClave());
        this.jtxtFechaAlta.setText(dateToString(usuario.getFecha_alta()));
        if (usuario.getFecha_baja() != null){
            //Si el usuario tiene fecha de baja, se muestra en el control 
            //y se deshabilita la opción de dar de baja
            this.jtxtFechaBaja.setText(dateToString(usuario.getFecha_baja()));
            setEnabledMenuBaja(false);
        }
        else{
            //Si el usuario no tiene fecha de baja, se inicializa el control
            //que muestra la fecha, sin valor,
            //y se habilita la opción de dar de baja
            this.jtxtFechaBaja.setText(null);
            setEnabledMenuBaja(true);
        }  
        //No se podrá seleccionar ninguna Universidad que no sea la del Estudiante y tampoco
        //se podrán hacer modificaciones en el mismo, por tanto, se deshabilita la opción de Guardar.
        setEnabledComboUniversidad(false);
        setEnabledMenuGuardar(false);
    }
    
    /**
     * Obtiene los nombres de las columnas de la tabla de resultados de búsquedas de usuarios.
     */
    private Object[] getTableColumnNames(){
        Object[] tableColumnNames = new Object[8];
        tableColumnNames[0] = GestorIdiomas.getMessage("tablausuarios.column.identificador");
        tableColumnNames[1] = GestorIdiomas.getMessage("tablausuarios.column.tipousuario");
        tableColumnNames[2] = GestorIdiomas.getMessage("tablausuarios.column.documento");
        tableColumnNames[3] = GestorIdiomas.getMessage("tablausuarios.column.nombre");
        tableColumnNames[4] = GestorIdiomas.getMessage("tablausuarios.column.apellidoprimero");
        tableColumnNames[5] = GestorIdiomas.getMessage("tablausuarios.column.fechaalta");
        tableColumnNames[6] = GestorIdiomas.getMessage("tablausuarios.column.fechabaja");
        tableColumnNames[7] = GestorIdiomas.getMessage("tablausuarios.column.universidad");
        return tableColumnNames;
    }
    
    
    //***********************************************
    // Métodos comunes a ambos paneles
    //***********************************************
    
    /**
     * Muestra el panel de gestión de usuarios alta/baja/consulta
     */
    private void showPanelGestion(){
        CardLayout usuarioCardLayout = (CardLayout)panelMain.getLayout(); 
        usuarioCardLayout.show(panelMain, "card2");
    }
    
    /**
     * Muestra el panel de búsqueda de usuarios
     */
    private void showPanelBusquedas(){
        CardLayout usuarioCardLayout = (CardLayout)panelMain.getLayout(); 
        usuarioCardLayout.show(panelMain, "card3");
    }
    
    /**
     * Función para habilitar/deshabilitar el menú Guardar y el botón que realiza la misma acción
     */
    private void setEnabledMenuGuardar(boolean enabled){
        this.btnSave.setEnabled(enabled);
        this.jmiGuardar.setEnabled(enabled);
    }
    
    /**
     * Función para habilitar/deshabilitar el menú Baja y el botón que realiza la misma acción
     */
    private void setEnabledMenuBaja(boolean enabled){
        this.btnDelete.setEnabled(enabled);
        this.jmiBaja.setEnabled(enabled);
    }

    /**
     * Función para habilitar/deshabilitar el botón para poder consultar las pruebas pendientes
     */
    private void setEnabledConsultarPruebas(boolean enabled){
        this.jbtnVerPruebas.setEnabled(enabled);
    }
    
    /**
     * Función para habilitar/deshabilitar el combo con las Universidades en el panel de gestión de usuarios
     */
    private void setEnabledComboUniversidad(boolean enabled){
        this.jcbbUniversidad.setEnabled(enabled);
    }
    
    /**
     * Función para establecer como selección del combo de las Universidades del panel de gestión
     * el primer item que muestra un texto genérico informativo
     */
    private void setSeleccionComboUniversidad(){
        this.jcbbUniversidad.setSelectedIndex(0);
    }
    
    /**
     * Función para establecer como selección del combo de las Universidades del panel de búsquedas
     * el primer item que muestra un texto genérico informativo
     */
    private void setEnabledComboUniversidadBusqueda(boolean enabled){
        this.jcbbsearchUniversidad.setEnabled(enabled);
    }
    
    /**
     * Función para establecer como selección del combo de las Universidades del panel de búsquedas
     * el primer item que muestra un texto genérico informativo
     */
    private void setSeleccionComboUniversidadBusqueda(){
        this.jcbbsearchUniversidad.setSelectedIndex(0);
    }
    
    /**
     * Inicializa el combo de Tipos de Usuarios en el panel de búsquedas de usuarios con los textos 
     * correspondientes a los Tipos.
     */
    private void inicializarComboTiposUsuarioBusqueda(){
        this.jcbbsearchTipoUsuario.addItem(GestorIdiomas.getMessage("pantallaaltausuario.jcbbsearchTipoUsuario.item.seleccion"));
        this.jcbbsearchTipoUsuario.addItem(TipoUsuario.ADMINISTRADOR.toString());
        this.jcbbsearchTipoUsuario.addItem(TipoUsuario.RESPONSABLE_PRUEBA.toString());
        this.jcbbsearchTipoUsuario.addItem(TipoUsuario.ESTUDIANTE.toString());
    }
    
    /**
     * Inicializa el combo de Tipos de Usuarios en el panel de gestión de usuarios con los textos 
     * correspondientes a los Tipos.
     */
    private void inicializarComboTiposUsuarioGestion(){
        this.jcbbTipoUsuario.addItem(GestorIdiomas.getMessage("pantallaaltausuario.jcbbTipoUsuario.item.seleccion"));
        this.jcbbTipoUsuario.addItem(TipoUsuario.ADMINISTRADOR.toString());
        this.jcbbTipoUsuario.addItem(TipoUsuario.RESPONSABLE_PRUEBA.toString());
        this.jcbbTipoUsuario.addItem(TipoUsuario.ESTUDIANTE.toString());
    }
    
    /**
     * Función que convierte una cadena en fecha.
     */
    private Date stringToDate(String s) throws ParseException{
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
        return formato.parse(s.trim());
    }
    
    /**
     * Función que convierte una fecha en cadena.
     */
    private String dateToString(Date d){
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
        return formato.format(d);
    }
    
    /**
     * Función que prepara el panel para el alta
     */
    private void alta(){
            clearPanelGestion();
            setEnabledPanelGestion(true);
            setEnabledMenuGuardar(true);
            showPanelGestion();
    }
    
    /**
     * Función que muestra mensaje de confirmación para realizar la baja del usuario y si es afirmativa la respuesta,
     * llama al proceso que hace efectiva dicha baja y verifica que si previamente había una búsqueda de usuarios
     * realizada, se refresque la búsqueda tras la baja.
     */
    private void baja(){
        //Comprobar primero que no tiene ya fecha de baja. Si es así mostrar aviso o deshabilitar menu baja.
        int seleccion = JOptionPane.showConfirmDialog(this,GestorIdiomas.getMessage("pantallaaltausuario.confirmarbaja"), GestorIdiomas.getMessage("pantallaaltausuario.confirmarbaja.title"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
        if (seleccion == JOptionPane.YES_OPTION){
            bajaUsuario();
            //Si la baja del usuario se produce tras una búsqueda de usuarios
            //hay que refrescar la pantalla de búsquedas, su JTable
            if (listaUsuarios != null && listaUsuarios.size() > 0){
                buscarUsuarios();
            }
        }
    }
    
    /**
     * Función que llama al proceso que hace efectiva el alta de usuario y verifica que si previamente había una búsqueda de usuarios
     * realizada, se refresque la búsqueda tras el alta.
     */
    private void guardar(){
        altaUsuario();
        //Si el alta de usuario se produce tras una búsqueda de usuarios
        //hay que refrescar la pantalla de búsquedas, su JTable
        if (listaUsuarios != null && listaUsuarios.size() > 0){
            buscarUsuarios();
        }
    }
    
    /**
     * Función que prepara el panel para las búsquedas
     */
    private void buscar(){
        setEnabledPanelGestion(true);
        setEnabledMenuGuardar(false);
        setEnabledMenuBaja(false);
        showPanelBusquedas();
    }
    
    /**
     * Función que sale del aplicativo. El usuario Administrador no puede acceder a otros subsistemas
     * diferentes al de gestión o búsquedas de usuarios.
     */
    private void salir(){
        this.setVisible(false);
        System.exit(0);
    }
    
    //*************
    // Acciones
    //*************
    
    /**
     * Acción que permite acceder al formulario para la introducción de datos para el alta
     */
    private void btnNewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewActionPerformed
        alta();
    }//GEN-LAST:event_btnNewActionPerformed

    /**
     * Acción que desencadena el caso de uso de baja
     */
    private void btnDeleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDeleteActionPerformed
        baja();
    }//GEN-LAST:event_btnDeleteActionPerformed

    /**
     * Acción que hace efectiva el alta de un usuario
     */
    private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSaveActionPerformed
        guardar();
    }//GEN-LAST:event_btnSaveActionPerformed

    /**
     * Acción para acceder al formulario de búsqueda de usuarios
     */
    private void btnFindActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnFindActionPerformed
        buscar();
    }//GEN-LAST:event_btnFindActionPerformed

    /**
     * Acción que desencadena salir del aplicativo
     */
    private void btnExitsalir(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExitsalir
        salir();
    }//GEN-LAST:event_btnExitsalir

    /**
     * En función del check se habilitará o no el campo de fecha de baja 
     * para, en caso de habilitarlo, permitir introducir un valor si se desea.
     */
    private void jcbActivosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcbActivosActionPerformed
        if(!this.jcbActivos.isSelected()){
            setEnabledSearchFechaBaja(true);
        }else{
            this.jftxtsearchFechaBaja.setText(null);
            setEnabledSearchFechaBaja(false);
        }
    }//GEN-LAST:event_jcbActivosActionPerformed

    /**
     * Acción que desencadena el caso de uso de búsqueda de usuarios
     */
    private void jbtnBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnBuscarActionPerformed
        //Si el Administrador ha introducido un identificador de usuario para 
        //filtrar las búsquedas
        if (this.jtxtsearchIdentificador.getText().trim().length() > 0){
            //Comprobamos si la cadena contiene un valor numérico
            if (isNumerico(this.jtxtsearchIdentificador.getText().trim())){
                buscarUsuarios();
            }else{
                //Si no tiene un valor numérico, mostramos mensaje de aviso
                /** Capturamos error en caso de que se intente dar de baja un estudiante con pruebas pendientes de realizar o finalizar */
                JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("error.identificadorusuario.no.numerico"), GestorIdiomas.getMessage("aviso"), JOptionPane.WARNING_MESSAGE);
            }
            
        }else{
            buscarUsuarios();
        }
    }//GEN-LAST:event_jbtnBuscarActionPerformed

    /**
     * Acción para limpiar los datos introducidos en la búsqueda
     */
    private void jbtnLimpiarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnLimpiarActionPerformed
        clearPanelBusqueda();
    }//GEN-LAST:event_jbtnLimpiarActionPerformed

    /**
     * Acción que controla si se ha realizado doble click sobre un usuario de
     * la lista de resultados de la búsqueda, para recuperar el usuario
     * y volcar su información en la pantalla de gestión
     */
    private void jtblsearchUsuariosMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jtblsearchUsuariosMouseClicked
       try{
            if (evt.getClickCount() == 2) {
                JTable target = (JTable)evt.getSource();
                int row = target.getSelectedRow();
                //int column = target.getSelectedColumn();
                //Seleccinamos el valor de la celda 0.
                int column = 0; 
                int id_usuario = Integer.parseInt(target.getModel().getValueAt(row, column).toString());
                for ( Iterator iterador = listaUsuarios.listIterator(); iterador.hasNext(); ) {
                        Usuario usuario = (Usuario) iterador.next();
                        //Chequeamos cual es el usuario en la la lista
                        //a partir del id_usuario de la celda de la tabla de resultados
                        //y cuando sea igual al id de la lista lo guardamos como
                        //usuario a gestionar 
                        if (usuario.getId_usuario() ==  id_usuario){
                            this.usuarioGestion = usuario;
                            break;
                        }
                }
                //Volcamos los datos en el panel de gestión
                setUsuarioToPanelGestion(this.usuarioGestion);
                //Mostramos el panel de gestión
                showPanelGestion();
        }
       }catch(UsuarioNoTipoUsuarioException exc){
           /** Capturamos excepción cuando el usuario no se corresponde al tipo de usuario que debe ser*/
           JOptionPane.showMessageDialog(this, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
       }catch(RemoteException exc){
           /** Capturamos excepción remota*/
           JOptionPane.showMessageDialog(this, exc.getMessage(), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
       }catch(Exception exc){
           /** Capturamos excepción de carácter general*/
           JOptionPane.showMessageDialog(this, GestorIdiomas.getMessage("error.general"), GestorIdiomas.getMessage("error"), JOptionPane.ERROR_MESSAGE);
       }
    }//GEN-LAST:event_jtblsearchUsuariosMouseClicked

    /**
     * Acción que inicia el proceso de ver las pruebas pendiente de realizar o finalizar de un estudiante
     */
    private void jbtnVerPruebasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnVerPruebasActionPerformed
        abrirPantallaPruebasEstudiante();
    }//GEN-LAST:event_jbtnVerPruebasActionPerformed

    /**
     * En función del tipo de usuario seleccionado se habilitará o no el 
     * combo de Universidades en el panel de gestión. 
     * Se inicializa como item seleccinado el primero que será el que contenga el texto genérico.
     */
    private void jcbbTipoUsuarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcbbTipoUsuarioActionPerformed
        if(this.jcbbTipoUsuario.getSelectedItem().equals(TipoUsuario.ESTUDIANTE.toString())){
            setSeleccionComboUniversidad();
            setEnabledComboUniversidad(true);
        }
        else{
            setSeleccionComboUniversidad();
            setEnabledComboUniversidad(false);
        }
    }//GEN-LAST:event_jcbbTipoUsuarioActionPerformed

    /**
     * En función del tipo de usuario seleccionado se habilitará o no el 
     * combo de Universidades en el panel de búsquedas. 
     * Se inicializa como item seleccinado el primero que será el que contenga el texto genérico.
     */
    private void jcbbsearchTipoUsuarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jcbbsearchTipoUsuarioActionPerformed
        if(this.jcbbsearchTipoUsuario.getSelectedItem().equals(TipoUsuario.ESTUDIANTE.toString())){
            setSeleccionComboUniversidadBusqueda();
            setEnabledComboUniversidadBusqueda(true);
        }
        else{
            setSeleccionComboUniversidadBusqueda();
            setEnabledComboUniversidadBusqueda(false);
        }
    }//GEN-LAST:event_jcbbsearchTipoUsuarioActionPerformed

    /**
     * Acción que desencadena salir del aplicativo
     */
    private void jmiSalirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiSalirActionPerformed
        salir();
    }//GEN-LAST:event_jmiSalirActionPerformed

    /**
     * Acción que permite acceder al formulario para la introducción de datos para el alta
     */
    private void jmiAltaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiAltaActionPerformed
        alta();
    }//GEN-LAST:event_jmiAltaActionPerformed

    /**
     * Acción que desencadena el caso de uso de baja
     */
    private void jmiBajaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiBajaActionPerformed
        baja();
    }//GEN-LAST:event_jmiBajaActionPerformed

    /**
     * Acción que hace efectiva el alta de un usuario
     */
    private void jmiGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiGuardarActionPerformed
        guardar();
    }//GEN-LAST:event_jmiGuardarActionPerformed

    /**
     * Acción para acceder al formulario de búsqueda de usuarios
     */
    private void jmiBusquedaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jmiBusquedaActionPerformed
        buscar();
    }//GEN-LAST:event_jmiBusquedaActionPerformed

    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(PantallaGestionUsuarios.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(PantallaGestionUsuarios.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(PantallaGestionUsuarios.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(PantallaGestionUsuarios.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the dialog
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                PantallaGestionUsuarios dialog = new PantallaGestionUsuarios(new PantallaMenuPrincipal(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {

                    @Override
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnDelete;
    private javax.swing.JButton btnExit;
    private javax.swing.JButton btnFind;
    private javax.swing.JButton btnNew;
    private javax.swing.JButton btnSave;
    private javax.swing.JMenu jMenuArchivo;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenu jMenuEdicion;
    private javax.swing.JPasswordField jPassword;
    private javax.swing.JPasswordField jPasswordVerificar;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JToolBar.Separator jSeparator2;
    private javax.swing.JToolBar.Separator jSeparator3;
    private javax.swing.JToolBar.Separator jSeparator4;
    private javax.swing.JToolBar.Separator jSeparator6;
    private javax.swing.JToolBar jToolBarraHerramientas;
    private javax.swing.JButton jbtnBuscar;
    private javax.swing.JButton jbtnLimpiar;
    private javax.swing.JButton jbtnVerPruebas;
    private javax.swing.JCheckBox jcbActivos;
    private javax.swing.JComboBox jcbbTipoUsuario;
    private javax.swing.JComboBox jcbbUniversidad;
    private javax.swing.JComboBox jcbbsearchFechaAlta;
    private javax.swing.JComboBox jcbbsearchFechaBaja;
    private javax.swing.JComboBox jcbbsearchTipoUsuario;
    private javax.swing.JComboBox jcbbsearchUniversidad;
    private javax.swing.JFormattedTextField jftxtsearchFechaAlta;
    private javax.swing.JFormattedTextField jftxtsearchFechaBaja;
    private javax.swing.JLabel jlblApellidoPrimero;
    private javax.swing.JLabel jlblApellidoSegundo;
    private javax.swing.JLabel jlblDocumento;
    private javax.swing.JLabel jlblFechaAlta;
    private javax.swing.JLabel jlblFechaBaja;
    private javax.swing.JLabel jlblIdentificador;
    private javax.swing.JLabel jlblLogin;
    private javax.swing.JLabel jlblNombre;
    private javax.swing.JLabel jlblPasword;
    private javax.swing.JLabel jlblSearchUniversidad;
    private javax.swing.JLabel jlblTiposUsuario;
    private javax.swing.JLabel jlblUniversidad;
    private javax.swing.JLabel jlblVerificar;
    private javax.swing.JLabel jlblsearchApellido1;
    private javax.swing.JLabel jlblsearchDocumento;
    private javax.swing.JLabel jlblsearchFechaAlta;
    private javax.swing.JLabel jlblsearchFechaBaja;
    private javax.swing.JLabel jlblsearchIdentificador;
    private javax.swing.JLabel jlblsearchNombre;
    private javax.swing.JLabel jlblsearchTipoUsuario;
    private javax.swing.JMenuItem jmiAlta;
    private javax.swing.JMenuItem jmiBaja;
    private javax.swing.JMenuItem jmiBusqueda;
    private javax.swing.JMenuItem jmiGuardar;
    private javax.swing.JMenuItem jmiSalir;
    private javax.swing.JTable jtblsearchUsuarios;
    private javax.swing.JTextField jtxtApellidoPrimero;
    private javax.swing.JTextField jtxtApellidoSegundo;
    private javax.swing.JTextField jtxtDocumento;
    private javax.swing.JTextField jtxtFechaAlta;
    private javax.swing.JTextField jtxtFechaBaja;
    private javax.swing.JTextField jtxtIdentificador;
    private javax.swing.JTextField jtxtLogin;
    private javax.swing.JTextField jtxtNombre;
    private javax.swing.JTextField jtxtsearchApellido1;
    private javax.swing.JTextField jtxtsearchDocumento;
    private javax.swing.JTextField jtxtsearchIdentificador;
    private javax.swing.JTextField jtxtsearchNombre;
    private javax.swing.JPanel panelBusquedas;
    private javax.swing.JPanel panelGestionUsuario;
    private javax.swing.JPanel panelMain;
    // End of variables declaration//GEN-END:variables
}
